#!/bin/sh -e
##  The contents of this file are subject to the Mozilla Public License
##  Version 1.1 (the "License"); you may not use this file except in
##  compliance with the License. You may obtain a copy of the License
##  at http://www.mozilla.org/MPL/
##
##  Software distributed under the License is distributed on an "AS IS"
##  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
##  the License for the specific language governing rights and
##  limitations under the License.
##
##  The Original Code is RabbitMQ.
##
##  The Initial Developer of the Original Code is GoPivotal, Inc.
##  Copyright (c) 2007-2014 GoPivotal, Inc.  All rights reserved.
##

# We set +e here since since our test for "readlink -f" below needs to
# be able to fail.
set +e
# Determine where this script is really located (if this script is
# invoked from another script, this is the location of the caller)
SCRIPT_PATH="$0"
while [ -h "$SCRIPT_PATH" ] ; do
    # Determine if readlink -f is supported at all. TODO clean this up.
    FULL_PATH=`readlink -f $SCRIPT_PATH 2>/dev/null`
    if [ "$?" != "0" ]; then
      REL_PATH=`readlink $SCRIPT_PATH`
      if expr "$REL_PATH" : '/.*' > /dev/null; then
        SCRIPT_PATH="$REL_PATH"
      else
        SCRIPT_PATH="`dirname "$SCRIPT_PATH"`/$REL_PATH"
      fi
    else
      SCRIPT_PATH=$FULL_PATH
    fi
done
set -e

SCRIPT_DIR=`dirname $SCRIPT_PATH`
RABBITMQ_HOME="${SCRIPT_DIR}/.."

## Set defaults
. ${SCRIPT_DIR}/rabbitmq-defaults

## Common defaults
SERVER_ERL_ARGS="+K true +A30 +P 1048576 \
  -kernel inet_default_connect_options [{nodelay,true}]"

# warn about old rabbitmq.conf file, if no new one
if [ -f /etc/rabbitmq/rabbitmq.conf ] && \
   [ ! -f ${CONF_ENV_FILE} ] ; then
    echo -n "WARNING: ignoring /etc/rabbitmq/rabbitmq.conf -- "
    echo "location has moved to ${CONF_ENV_FILE}"
fi

# We save the current value of $RABBITMQ_PID_FILE in case it was set by
# an init script. If $CONF_ENV_FILE overrides it again, we must ignore
# it and warn the user.
saved_RABBITMQ_PID_FILE=$RABBITMQ_PID_FILE

## Get configuration variables from the configure environment file
[ -f ${CONF_ENV_FILE} ] && . ${CONF_ENV_FILE} || true

if [ "$saved_RABBITMQ_PID_FILE" -a \
     "$saved_RABBITMQ_PID_FILE" != "$RABBITMQ_PID_FILE" ]; then
    echo "WARNING: RABBITMQ_PID_FILE was already set by the init script to:" 1>&2
    echo "           $saved_RABBITMQ_PID_FILE" 1>&2
    echo "         The value set in rabbitmq-env.conf is ignored because it" 1>&2
    echo "         would break the init script." 1>&2

    RABBITMQ_PID_FILE="$saved_RABBITMQ_PID_FILE"
fi

[ "x" = "x$RABBITMQ_USE_LONGNAME" ] && RABBITMQ_USE_LONGNAME=${USE_LONGNAME}
if [ "xtrue" = "x$RABBITMQ_USE_LONGNAME" ] ; then
    RABBITMQ_NAME_TYPE=-name
    [ "x" = "x$HOSTNAME" ] && HOSTNAME=`env hostname -f`
    [ "x" = "x$NODENAME" ] && NODENAME=rabbit@${HOSTNAME}
else
    RABBITMQ_NAME_TYPE=-sname
    [ "x" = "x$HOSTNAME" ] && HOSTNAME=`env hostname`
    [ "x" = "x$NODENAME" ] && NODENAME=rabbit@${HOSTNAME%%.*}
fi

##--- Set environment vars RABBITMQ_<var_name> to defaults if not set

rmq_realpath() {
    local path=$1

    if [ -d "$path" ]; then
        cd "$path" && pwd
    elif [ -f "$path" ]; then
        cd "$(dirname "$path")" && echo $(pwd)/$(basename "$path")
    else
        echo "$path"
    fi
}

rmq_check_if_shared_with_mnesia() {
    local var

    local mnesia_dir=$(rmq_realpath "${RABBITMQ_MNESIA_DIR}")
    local prefix="WARNING:"

    for var in "$@"; do
        local dir=$(eval "echo \"\$$var\"")

        case $(rmq_realpath "$dir") in
        ${mnesia_dir})
            warning=1
            echo "$prefix $var is equal to RABBITMQ_MNESIA_DIR" 1>&2
            ;;
        ${mnesia_dir}/*)
            warning=1
            echo "$prefix $var is located inside RABBITMQ_MNESIA_DIR" 1>&2
            ;;
        esac

        if [ "x$warning" = "x1" ]; then
            prefix="        "
        fi
    done

    if [ "x$warning" = "x1" ]; then
        echo "$prefix => Auto-clustering will not work ('cluster_nodes' in rabbitmq.config)" 1>&2
    fi
}

DEFAULT_NODE_IP_ADDRESS=auto
DEFAULT_NODE_PORT=5672
[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && RABBITMQ_NODE_IP_ADDRESS=${NODE_IP_ADDRESS}
[ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${NODE_PORT}

[ "x" = "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" != "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_IP_ADDRESS=${DEFAULT_NODE_IP_ADDRESS}
[ "x" != "x$RABBITMQ_NODE_IP_ADDRESS" ] && [ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_NODE_PORT=${DEFAULT_NODE_PORT}

[ "x" = "x$RABBITMQ_DIST_PORT" ] && RABBITMQ_DIST_PORT=${DIST_PORT}
[ "x" = "x$RABBITMQ_DIST_PORT" ] && [ "x" = "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_DIST_PORT=$((${DEFAULT_NODE_PORT} + 20000))
[ "x" = "x$RABBITMQ_DIST_PORT" ] && [ "x" != "x$RABBITMQ_NODE_PORT" ] && RABBITMQ_DIST_PORT=$((${RABBITMQ_NODE_PORT} + 20000))

[ "x" = "x$RABBITMQ_NODENAME" ] && RABBITMQ_NODENAME=${NODENAME}
[ "x" = "x$RABBITMQ_SERVER_ERL_ARGS" ] && RABBITMQ_SERVER_ERL_ARGS=${SERVER_ERL_ARGS}
[ "x" = "x$RABBITMQ_CONFIG_FILE" ] && RABBITMQ_CONFIG_FILE=${CONFIG_FILE}
[ "x" = "x$RABBITMQ_LOG_BASE" ] && RABBITMQ_LOG_BASE=${LOG_BASE}
[ "x" = "x$RABBITMQ_MNESIA_BASE" ] && RABBITMQ_MNESIA_BASE=${MNESIA_BASE}
[ "x" = "x$RABBITMQ_SERVER_START_ARGS" ] && RABBITMQ_SERVER_START_ARGS=${SERVER_START_ARGS}
[ "x" = "x$RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS" ] && RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS=${SERVER_ADDITIONAL_ERL_ARGS}
[ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${MNESIA_DIR}
[ "x" = "x$RABBITMQ_MNESIA_DIR" ] && RABBITMQ_MNESIA_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}

[ "x" = "x$RABBITMQ_PID_FILE" ] && RABBITMQ_PID_FILE=${PID_FILE}
[ "x" = "x$RABBITMQ_PID_FILE" ] && RABBITMQ_PID_FILE=${RABBITMQ_MNESIA_DIR}.pid

[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${PLUGINS_EXPAND_DIR}
[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-plugins-expand

[ "x" = "x$RABBITMQ_ENABLED_PLUGINS_FILE" ] && RABBITMQ_ENABLED_PLUGINS_FILE=${ENABLED_PLUGINS_FILE}

[ "x" = "x$RABBITMQ_PLUGINS_DIR" ] && RABBITMQ_PLUGINS_DIR=${PLUGINS_DIR}

## Log rotation
[ "x" = "x$RABBITMQ_LOGS" ] && RABBITMQ_LOGS=${LOGS}
[ "x" = "x$RABBITMQ_LOGS" ] && RABBITMQ_LOGS="${RABBITMQ_LOG_BASE}/${RABBITMQ_NODENAME}.log"
[ "x" = "x$RABBITMQ_SASL_LOGS" ] && RABBITMQ_SASL_LOGS=${SASL_LOGS}
[ "x" = "x$RABBITMQ_SASL_LOGS" ] && RABBITMQ_SASL_LOGS="${RABBITMQ_LOG_BASE}/${RABBITMQ_NODENAME}-sasl.log"

[ "x" = "x$RABBITMQ_CTL_ERL_ARGS" ] && RABBITMQ_CTL_ERL_ARGS=${CTL_ERL_ARGS}

# Check if files and directories non-related to Mnesia are configured
# to be in $RABBITMQ_MNESIA_DIR. If this is the case, issue a warning
# because it will prevent auto-clustering from working (the node will be
# considered non-virgin).

rmq_check_if_shared_with_mnesia \
    RABBITMQ_CONFIG_FILE \
    RABBITMQ_LOG_BASE \
    RABBITMQ_PID_FILE \
    RABBITMQ_PLUGINS_EXPAND_DIR \
    RABBITMQ_ENABLED_PLUGINS_FILE \
    RABBITMQ_PLUGINS_DIR \
    RABBITMQ_LOGS \
    RABBITMQ_SASL_LOGS

##--- End of overridden <var_name> variables

# Since we source this elsewhere, don't accidentally stop execution
true
